#ifndef HTTP_REQUEST_H
#define HTTP_REQUEST_H

#include "../buffer/buffer.h"
#include <string>
#include <unordered_map>
#include <unordered_set>

class HttpRequest {
public:
    enum PARSE_STATE {
        REQUEST_LINE, // 请求头
        HEADERS,      // 首部行
        BODY,         // 实体体
        FINISH,
    };

    // http报文状态码
    enum HTTP_CODE {
        NO_REQUEST = 0,
        GET_REQUEST,
        BAD_REQUEST,
        NO_RESOURSE,
        FORBIDDENT_REQUEST, // 无访问权限
        FILE_REQUEST,
        INTERNAL_ERROR,
        CLOSED_CONNECTION,
    };

    HttpRequest() { Init(); }
    ~HttpRequest() = default;

    void Init();
    bool parse(Buffer& buff);

    // 获取请求资源路径
    std::string path() const;
    std::string& path();
    // 获取http请求的方法，如：GET，POST，PUT等
    std::string method() const;
    // 获取http版本号
    std::string version() const;
    // 获取POST请求中的指定键的值
    std::string GetPost(const std::string& key) const;
    std::string GetPost(const char* key) const;

    bool IsKeepAlive() const;

private:
    bool ParseRequestLine_(const std::string& line);
    void ParseHeader_(const std::string& line);
    void ParseBody_(const std::string& line);

    void ParsePath_();
    void ParsePost_();
    // 是将 URL 编码的字符串解析为原始格式的数据
    void ParseFromUrlencoded_();

    // 验证用户的身份信息
    static bool UserVerify(const std::string& name, const std::string& pwd, bool isLogin);

    // 解析状态
    PARSE_STATE state_;
    // 请求方法，请求路径，协议版本，请求体（主要是POST请求中的表单或json数据）
    std::string method_, path_, version_, body_;

    // 请求头
    std::unordered_map<std::string, std::string> header_;
    // 请求体中的POST数据
    std::unordered_map<std::string, std::string> post_;

    // 找不到页面时的默认HTML页面
    static const std::unordered_set<std::string>  DEFAULT_HTML;
    /*
        这个我还不是很明白
    */
    static const std::unordered_map<std::string, int>  DEFAULT_HTML_TAG;
    // 十六进制转换为整数
    static int ConverHex(char ch);
};

#endif